15th-GYCTF

date: 2017-06-12 14:59:44

tags: CTF

第一&二题Web(不是原题但类似)

题目说这个过滤了很多敏感符号,于是先构造一下常用的payload:

  • Username:’ or 1=1 #

  • Password:随意

发现or 和 #都被过滤掉了,通过测试发现–也被过滤了,看起来是很可怕,但是不过幸好’没有被过滤,于是构造一个payload:

  • username=travis’=’(一般数据库里不可能有这个小名)
  • password=travis’=’

这个时候成果获得flag
为什么这样可以绕过呢?
当提交username=travis’=’&password=travis’=’
语句会变成如下:

  • select * from user where username=’travis’=’’ and password=’travis’=’’

这时候还不够清晰,提取前一段判断出来(后面的同样道理)
username=’travis’=’’
这是有2个等号,然后计算顺序从左到右,
先计算username=’travis’ 一般数据库里不可能有这个小名(若有,就换一个字符串),所以这里返回值为0(相当于false)
然后0=’’ 这个结果呢?就是返回1(相当于true)
所以这样的注入相当于
select from user where 1 and 1
也等于 select
from user
上面那个比较是弱类型的比较,
以下情况都会为true

  • 1=’1’
  • 1=’1.0’
  • 1=’1后接字母(再后面有数字也可以)
  • ‘0=’除了非0数字开头的字符串’
    (总体上只要前面达成0的话,要使语句为true很简单,所以这题的万能密码只要按上面的法子去写可以写很多)

第三题(文件上传)

题目描述:上传一个php文件

随便挑一个小文件,发现它对上传的文件有一定要求:要上传php文件,但是文件类型只支持jpg,gif,png.

所以想到了00截断:

%00截断的核心,就是chr(0)这个字符

先说一下这个字符,这个字符不为空(Null),也不是空字符(“”),更不是空格!

当程序在输出含有chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致漏洞产生

1
2
3
4
5
path="upfiles/picture/" 
file="20121212.jpg" 
<font color=#ff0000 face="黑体">
upfilename=path & file</font> '最后的上传地址 
%>

就这段代码中的path为上传的路径,file为生成的文件名,upfilename为上传后的地址,程序表面是没什么问题,但如果path可以由用户自定义(path这个参数往往是从表单或参数传过来的,能够自定义),所以就产生了上传路径截断漏洞

比如我在表单中把路径改成了“upfiles/1.aspChr(0)”
这样上传路径就成了 path=”upfiles/1.aspChr(0)” chr(0)代表那个截断字符
这时变量被输出时,就成了upfiles/1.asp
而不是upfiles/upfiles/1.aspChr(0)20121212.jpg
很明显,upfile/1.asp就成了she11

你可以马上做个实验

把上面的代码修改一下:

1
2
3
4
5
path="upfiles/1.asp" & Chr(0) 'asp中chr(0)表示截断字符
file="20121212.jpg" 
upfilename=path & file '最后的上传地址 
response.write upfilename 
%>

眼见为实,你会发现最后输出的upfilename确实是upfile/1.asp,变量输出是这样,上传时生成文件当然也会这样,这就是大家常听到的路径截断上传!

回到题中:
我们可以在burp中修改path参数~
打开burp:


发现 path=“/uploads/”

文件名 filename=“1493190357627.gif”(gif满足文件要求)

本来最后的上传地址:path & filename

/uploads/1493190357627.gif

如果加上%00截断呢?

/uploads/1.php%001493190357627.gif

原文

[第四题] (http://www.shiyanbar.com/ctf/1848)

这个很详细链接

-------------本文结束感谢您的阅读-------------